package com.zhangxiaofanfan;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 三种创建线程的方式
 *
 * @author zhangxiaofanfan
 * @date 2025-02-07 15:34:55
 */
@Slf4j
public class ThreadFirst {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        createThread01();
        createThread02();
        createThread03();
    }

    /**
     * 继承 Thread 的方式完成线程对象的创建和启动
     */
    public static void createThread01() {
        Thread thread = new Thread("extend") {
            @Override
            public void run() {
                log.info("使用继承 Thread 的方式完成线程对象的创建");
            }
        };
        thread.start();
    }

    /**
     * 实现 Runnable 的方式完成线程对象的创建和启动
     */
    public static void createThread02() {
        Runnable runnable = () -> log.info("使用 Runnable 的方式完成线程对象的创建");
        Thread thread = new Thread(runnable, "runnable");
        thread.start();
    }

    /**
     * 使用 FutureTask 的方式完成线程对象的创建和启动
     *
     * @throws ExecutionException 执行过程中的异常对象
     * @throws InterruptedException 中断异常对象
     */
    public static void createThread03() throws ExecutionException, InterruptedException {
        FutureTask<Integer> task = new FutureTask<>(() -> {
            log.info("使用 callable 的方式完成线程对象的创建");
            return 100;
        });
        Thread thread = new Thread(task, "callable");
        thread.start();
        log.info("结果为: {}", task.get());
    }
}
